/**
 * 定义一个立即执行函数，传入window对象;
 * 该函数的作用是判断元素是否包含某个类名，添加某个类名，删除某个类名
 * @param {Window} window
 */
(function (window) {
  "use strict";
  // 定义一个函数，用于判断元素是否包含某个类名
  function classReg(className) {
    return new RegExp("(^|\\s+)" + className + "(\\s+|$)");
  }

  // 定义三个变量，用于存储判断、添加、删除类名的函数
  let hasClass, addClass, removeClass;

  // 判断当前浏览器是否支持classList属性
  if ("classList" in document.documentElement) {
    // 如果支持，则使用classList的API实现判断、添加、删除类名的函数
    hasClass = function (elem, c) {
      return elem.classList.contains(c);
    };
    addClass = function (elem, c) {
      elem.classList.add(c);
    };
    removeClass = function (elem, c) {
      elem.classList.remove(c);
    };
  } else {
    // 如果不支持，则使用正则表达式实现判断、添加、删除类名的函数
    hasClass = function (elem, c) {
      return classReg(c).test(elem.className);
    };
    addClass = function (elem, c) {
      // 如果元素不包含该类名，则添加该类名
      if (!hasClass(elem, c)) {
        elem.className = elem.className + " " + c;
      }
    };
    removeClass = function (elem, c) {
      // 使用正则表达式替换类名
      elem.className = elem.className.replace(classReg(c), " ");
    };
  }

  // 定义一个函数，用于切换类名
  function toggleClass(elem, c) {
    // 根据元素是否包含该类名，选择添加或删除类名的函数
    const fn = hasClass(elem, c) ? removeClass : addClass;
    fn(elem, c);
  }
  // 定义一个对象，包含判断、添加、删除、切换类名的函数
  const classie = {
    hasClass,
    addClass,
    removeClass,
    toggleClass,

    has: hasClass,
    add: addClass,
    remove: removeClass,
    toggle: toggleClass,
  };

  // 如果当前环境支持AMD模块化规范，则定义一个模块
  if (typeof define === "function" && define.amd) {
    define(classie);
  } else {
    // 否则，将classie对象挂载到window对象上
    window.classie = classie;
  }
})(window);
